/**
 * 
 */
package NoteBook;

import org.junit.Test;

/**
 * abstract基础讲解
 * 
 * 特点：必须重写方法
 * 
 * 抽象类， 使用abstract进行修饰
 * 
 * 用法：1、 抽象类属于类，能声明类中的所有资源（属性，构造器，方法，静态代码块）
 *
 *      2、 抽象方法的声明，使用abstract修饰的方法，抽象方法不能提供方法体
 *
 * @author Jiang Zhiyan
 * 2021年4月29日 下午7:33:52
 */

public class _15Abstract {
	@Test
	public void mooTest() {
		//注意此处不能使用Moo m1 = new Moo();
		Moo m1 = new Koo();
		m1.show();
//		new Moo();  抽象类不能实例化		
	}
}

abstract class Moo{
//	能够声明构造器，但是不能实例化 构造器——实例化对象的根本途径
   //抽象类的构造器是为子类实例化时进行初始化操作
	private String data;
	public static final double PI= 3.14;
	
	public String getData() {
		return this.getData();
	}
	//少用但可行
	public Moo() {
	   
   }
	
	/**
	 * 抽象方法：使用abstract关键字进行修饰、没有方法体的方法
	 *  声明方法的存在，但是没有具体的实现。
	 * 特点：对子类进行规约，子类继承抽象类，必须重写抽象类中的所有抽象方法
	 *不能使用private 一般用protected/public
	 */
	public abstract void show();
}
class Koo extends Moo {

	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("abstract 子类方法体定义成功！");
	}
	
}
